package demo5;

import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Component注解，被该注解标注的类受Spring容器管理
 *
 * @Controller注解，被该注解标注的类也受Spring容器管理，并且除此之外还赋予了一些其他功能
 * 在SpringMVC框架中，被该注解标注的类是一个Controller，用于和客户端打交道
 *
 * @Service注解，通常用来标注那些业务逻辑层的类，处理业务逻辑。同样该注解标注的类也受Spring容器管理
 *
 * @Repository注解，通常用来标注数据持久层中的了，这些类用于和数据库打交道。使用该注解标注的类也受Spring容器管理
 *@Repository注解，通常用来标注数据持久层中的了，这些类用于和数据库打交道。使用该注解标注的类也受Spring容器管理
 *
 * @Resource注解默认的装配机制与@Autowired一致,依靠类型匹配，
 * 首先在容器内部寻找该属性的类型, 看看是否存在, 若存在则直接装配
 * 如果不存在,查看是否有该属性类型的子类型,如果有将其装配,如果存在多个子类型则抛出冲突异常
 *
 * @Resource注解解决装配冲突的几种操作:
 * 1:@Resource(name="类名")
 * 通过向@Resource注解中传入name参数,参数值为要加载的类的类名来让Spring容器完成依赖注入
 * 需要注意:这里虽然是类名,但是[首字母要小写]
 * @Resource(name="shirt")注入Shirt这个类
 * @Resource(name="sweater")注入Sweater这个类
 * 缺点:限制了依赖的类的类名.
 *
 * */
@Component
//@Controller
// @Service
//@Repository
public class Person {
    /**
     * @Autowired 自动装配注解
     *Spring中的开发模式里,当A类需要使用B类的功能时,应当将B类作为属性定义在A类中,当然这里最好定义的是
     * 接口类型,以便日后可以随时更换为C类,D类.等等(B,C,D...这些类都实现类该接口).
     * 这种将A类依赖的B类定义为属性,让Spring容器将这个依赖的B类通过属性设置到A类中建立A与B的依赖关系,
     * 这个过程称为[依赖注入],意思是将A类"依赖"的B类通过属性"注入"给A类.
     *
     * 2.要求属性的名字与类一致
     * 2:要求属性的名字与类名一致
     * @Resource
     * 注入Shirt这个类private Clothes shirt;
     *
     * @Resource
     * private Clothes sweater;注入Sweater这个类
     *
     * @Resource整体看可选择的注入方式多,但是解决装配冲突问题时缺点相同--限制依赖方类的名字
     * @Resource实际开发中用的很少,基本上在Spring容器中使用的装配注解还是:@Autowired
     *
     * */
//    @Autowired
    //@Resource(name = "sweater")
   // @Resource(name = "shirt")
// 使用Resource注解注入Clothes类型的资源
@Resource
//private Clothes shirt;
private Clothes clothes;

/**
 * 玩耍方法
 * 在玩耍之前，需要穿上衣服
 * 这个方法演示了如何使用依赖的Clothes资源
 */
public void play(){
  // 穿上衣服
  clothes.wear();
  //  shirt.wear();
  //  sweater.wear();
  // 出去玩
  System.out.println("出去玩");
}
